package com.wjh.www.util;

import com.wjh.www.config.ConnectionPool;

import java.sql.Connection;
import java.sql.SQLException;

import static com.wjh.www.dao.SqlRunnerImpl.CONNECTION_POOL;


/**
 * 用于管理service的事务的工具类
 *
 * @author wjh
 * @date 2021/5/18 13:39
 * @Package com.wjh.www.util
 */
public class TransactionUtil {

    private TransactionUtil() {

    }

    /**
     * 获取连接池中的连接，并设置该连接为线程共享
     *
     * @return 返回connection对象
     */
    public static Connection getConnection() {
        return CONNECTION_POOL.getThreadConnection();
    }


    /**
     * 设置事务手动提交，事务开始
     *
     * @param conn connection对象
     */
    public static void beginTransaction(Connection conn) {
        try {
            if (conn != null) {
                if (conn.getAutoCommit()) {
                    conn.setAutoCommit(false);
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }


    /**
     * 事务正常运行，提交事务
     *
     * @param conn connection对象
     */
    public static void commitTransaction(Connection conn) {
        try {
            if (conn != null) {
                if (!conn.getAutoCommit()) {
                    conn.commit();
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }


    /**
     * 设置Connection为原始状态
     *
     * @param conn connection对象
     */
    public static void recoverTransaction(Connection conn) {
        try {
            if (conn != null) {
                conn.setAutoCommit(!conn.getAutoCommit());
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 发生异常回滚事务
     *
     * @param conn connection对象
     */
    public static void rollback(Connection conn) {
        try {
            if (conn != null) {
                conn.rollback();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 关闭绑定到线程上面的connection对象
     */
    public static void closeThreadConn() {
        ConnectionPool.closeThreadConn();
    }

}